import time
from multiprocessing import shared_memory
import numpy as np


# 等待一个节点的共享内存创建
def WaitForShm(shm_name):
    # 等待共享内存创建
    while True:
        try:
            # 尝试以只读模式打开共享内存
            shm = shared_memory.SharedMemory(name=shm_name)
            break  # 如果成功打开，跳出循环
        except FileNotFoundError:
            print("等待共享内存创建...")
            time.sleep(1)  # 等待 1 秒后重试
    return shm


# 定义共享内存名称
cpp_out_shm_name    = 'cpp_out'
python_out_shm_name = 'python_out'

python_out_shm_name = shared_memory.SharedMemory(create=True, size=1024, name=python_out_shm_name)  # 创建共享内存，并指定名字
cpp_out_shm = WaitForShm(cpp_out_shm_name)  # 等待cpp的共享内存创建

while True:
    kind = input("输入命令: \n\t1:输入\n\t2:读取\n\t3:退出\n-> ")

    # 往内存中写
    if kind == '1':
        data = int(input("\n输入数据: "))
        data = np.array([data], dtype=np.int32)
        python_out_shm_name.buf[:data.nbytes] = data.tobytes()

        print("Python: 数据已写入共享内存:", data[0], "\n")
    
    if kind == '2':
        print("\n读取内存中的数据...")
        data_size = 4  # 假设写入的数据是一个 int32
        retrieved_data = np.frombuffer(cpp_out_shm.buf[:data_size], dtype=np.int32)
        print("cpp: 共享内存中的数据:", retrieved_data[0], "\n")

    if kind == '3':
        print("退出...")
        break

# 清除内存
cpp_out_shm.close()

python_out_shm_name.close()
python_out_shm_name.unlink()
